package com.dragons.dragonsvf.utils.image_compress;

import net.coobird.thumbnailator.Thumbnails;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @author Dragons.G
 * @date 2025-03-18 21:16:31
 * @description 利用maven工具包对图片进行压缩
 */
public class ImageCompressionUtil {
    /**
     * 对图片进行无损压缩
     * @param sourceFilePath 源图片文件路径
     * @param targetFilePath 目标图片文件路径
     */
    public static void compressImage(String sourceFilePath, String targetFilePath) {
        try {
            //scale(1.0) 确保图片尺寸不变，outputQuality(0.8) 设置输出图片的质量为 80%，最后将处理后的图片保存到目标路径。
            Thumbnails.of(new File(sourceFilePath))
                .scale(0.7) // 图片尺寸大小
                .outputQuality(0.3)//
                .toFile(targetFilePath);
        } catch (IOException e) {
            System.err.println("图片压缩时发生错误: " + e.getMessage());
        }
    }

    public static void compressImageTest(String sourceFilePath, String targetFilePath) {
        try {
            //scale(1.0) 确保图片尺寸不变，outputQuality(0.8) 设置输出图片的质量为 80%，最后将处理后的图片保存到目标路径。
            Thumbnails.of(new File(sourceFilePath))
                .scale(1) // 图片尺寸大小
                .outputQuality(0.2)
                .toFile(targetFilePath);
        } catch (IOException e) {
            System.err.println("图片压缩时发生错误: " + e.getMessage());
        }
    }

    public static double getImageSizeMB(String filePath) {
        File file = new File(filePath);
        if (!file.exists() || file.isDirectory()) {
            return -1; // 文件不存在或为目录
        }
        long bytes = file.length();
        return bytes / (1024.0 * 1024.0); // 转换为 MB（1MB = 1024*1024 字节）
    }

    public static double getImageSizeMB(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return -1; // 文件为空或未上传
        }
        long bytes = file.getSize(); // 直接获取文件字节大小（MultipartFile 提供的方法）
        return bytes / (1024.0 * 1024.0); // 转换为 MB（1MB = 1024×1024 字节）
    }

    public static void compressPngWithThumbnailator(String sourceFilePath, String targetFilePath) {
        try {
            Thumbnails.of(new File(sourceFilePath))
                // 核心修正：移除 outputQuality（对 PNG 无效），保持原始尺寸和格式
                .scale(1.0) // 1.0 表示原始尺寸（避免缩放导致像素重采样）
                .outputFormat("PNG") // 显式指定 PNG 格式（防止自动推断为其他格式）
                // 以下为可选优化（根据 Thumbnailator 文档，部分版本支持 PNG 压缩参数）
                //.setOption("compressionLevel", 9) // 尝试设置压缩级别（需库支持，0.4.14 可能不支持，可忽略）
                .toFile(targetFilePath);
        } catch (IOException e) {
            System.err.println("图片压缩时发生错误: " + e.getMessage());
        }
    }

    public static void main(String[] args) throws IOException {
        String imgName = "27.jpg";
        String sourceFilePath = "C:\\Users\\DragonG\\Pictures\\TEST\\"+imgName;
        String targetFilePath = "C:\\Users\\DragonG\\Pictures\\TEST\\result-"+imgName;
//        double imageSizeMB = getImageSizeMB(sourceFilePath);
//        System.out.println(imageSizeMB > 3);
        compressImageTest(sourceFilePath, targetFilePath);

        // 小于1 MB 的不压缩
        // 1-5   scale 1 qulity 0.3
        // 5 - 10  scale 0.6  qulity 0.3
        // 10-20 scale 0.65  qulity 0.2
        // 20 以上的 scale 1  qulity 0.1

        // 小于 1MB的不压缩
        // 如果是png 则 判断大小  如果大于4 小于 5MB 则 scale 0.3 qulity 0.2
        // 如果是 1 - 3 MB   scale 4 qulity 0.2
    }


    /**
     * 对图片进行无损压缩，并将压缩后的数据转换为 MultipartFile
     * @param sourceFilePath 源图片文件路径
     * @param fileName 文件名
     * @param contentType 文件类型
     * @return 压缩后的 MultipartFile
     */
    public static MultipartFile compressImageToMultipartFile(String sourceFilePath, String fileName, String contentType) {
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            Thumbnails.of(new File(sourceFilePath))
                .scale(1.0)
                .outputQuality(0.8)
                .toOutputStream(outputStream);

            byte[] compressedBytes = outputStream.toByteArray();
            return new CustomMultipartFile(fileName, fileName, contentType, compressedBytes);
        } catch (IOException e) {
            System.err.println("图片压缩时发生错误: " + e.getMessage());
            return null;
        }
    }

    /**
     * 接收 MultipartFile 并返回压缩后的 MultipartFile
     * @param file 待压缩的 MultipartFile
     * @return 压缩后的 MultipartFile
     */
    public static MultipartFile compressMultipartFile(MultipartFile file) {
        try (InputStream inputStream = file.getInputStream();
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {

            Thumbnails.of(inputStream)
                .scale(1.0)
                .outputQuality(0.3)
                .toOutputStream(outputStream);

            byte[] compressedBytes = outputStream.toByteArray();
            return new CustomMultipartFile(file.getOriginalFilename(), file.getOriginalFilename(), file.getContentType(), compressedBytes);
        } catch (IOException e) {
            System.err.println("图片压缩时发生错误: " + e.getMessage());
            return null;
        }
    }



    public static MultipartFile compressMultipartFile(MultipartFile file,double scale, double quality) {
        try (InputStream inputStream = file.getInputStream();
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {

            Thumbnails.of(inputStream)
                .scale(scale)
                .outputQuality(quality)
                .toOutputStream(outputStream);

            byte[] compressedBytes = outputStream.toByteArray();
            return new CustomMultipartFile(file.getOriginalFilename(), file.getOriginalFilename(), file.getContentType(), compressedBytes);
        } catch (IOException e) {
            System.err.println("图片压缩时发生错误: " + e.getMessage());
            return null;
        }
    }

//    public static void main(String[] args) {
//        String sourceFilePath = "C:\\D-Files\\my_blog\\dragonsVF\\dragons-vf\\src\\main\\java\\com\\dragons\\dragonsvf\\utils\\image_compress\\imgs\\原始.jpg";
//        String fileName = "原始.jpg";
//        String contentType = "image/jpeg";
//        MultipartFile compressedFile = compressImageToMultipartFile(sourceFilePath, fileName, contentType);
//        if (compressedFile != null) {
//            System.out.println("压缩后的 MultipartFile 大小: " + compressedFile.getSize() + " 字节");
//        }
//    }




}
